﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAO;
using Entidades;

namespace Negocio
{
    public class TablaPosicionesRules
    {
        public TablaPosicionesEntity ObtenerTablaPosicionesPorId(int id)
        {
            var dao = new TablaPosicionesDAO();
            return dao.Select(id);
        }

        public List<TablaPosicionesEntity> SeleccionarTablaPosicionesBoletaPorFiltro(int? id, int? etapaId, string descripcion)
        {
            var dao = new TablaPosicionesDAO();
            var lista = dao.SelectAll();
            var listaFiltrada = (from t in lista
                                 where ((!id.HasValue || t.Id == id.Value) &&
                                        (!etapaId.HasValue || t.Etapa.Id == etapaId) &&
                                        (string.IsNullOrEmpty(descripcion) || t.Descripcion == descripcion)
                                       )
                                 select t).ToList<TablaPosicionesEntity>();

            return listaFiltrada;
        }

        public void RegistrarResultadosDeEtapa(EtapaEntity etapa)
        {
            int aciertos;
            TablaPosicionesEntity tabla = new TablaPosicionesEntity();
            List<DetalleTablaPosicionesEntity> detalles = new List<DetalleTablaPosicionesEntity>();
            tabla.Detalle = new List<DetalleTablaPosicionesEntity>();
            var boletas = new BoletaRules().SeleccionarBoletaPorFiltro(null, null, null, null, etapa.Id);
            var dao = new TablaPosicionesDAO();
            tabla.Id = 0;
            tabla.Etapa = etapa;
            tabla.Descripcion = "Resultados Etapa " + etapa.Nombre;
            for (int i = 0; i < boletas.Count; i++)
            {
                aciertos = 0;
                foreach (PartidoEntity p in etapa.Partidos)
                    foreach (DetalleBoletaEntity det in boletas[i].Detalle)
                        if (det.Partido.Id == p.Id)
                        {
                            if (!p.GolLocal.HasValue || !p.GolVisitante.HasValue)
                                throw new ApplicationException("Existe al menos un partido en la etapa que no se ha registrado su resultado");
                            if ((p.GolLocal.Value > p.GolVisitante.Value && det.Resultado == EnumResultados.LOCAL.ToString()) ||
                               (p.GolLocal.Value == p.GolVisitante.Value && det.Resultado == EnumResultados.EMPATE.ToString()) ||
                               (p.GolLocal.Value < p.GolVisitante.Value && det.Resultado == EnumResultados.VISITANTE.ToString()))
                                aciertos++;
                        }
                tabla.Detalle.Add(new DetalleTablaPosicionesEntity() { Boleta = boletas[i], Puntaje = aciertos });
            }
            dao.Insert(tabla);
        }

    }    

}
